package ljl.alg.wangzheng_camp.round1.array_and_list;

import commons.ListNode;

/**
 * 草他妈这道题浪费了我太多时间
 * */
public class _25_reverse_k_group {
    
    /**
     * 怎么说（shuò）呢
     * 改了半天，得有将近一个小时
     *
     * 就这几行代码
     *
     * 我和官方题解的思路是基本一样的
     *
     * */
    public ListNode reverseKGroup(ListNode head, int k) {
        if (k == 1) return head;
        ListNode dum = new ListNode(0, head);
        ListNode start = head, end = head;
        ListNode prev = dum, next;
        while (true) {
            int i = 0;
            while (end != null && ++i < k) {
                end = end.next;
            }
            // prev start end end.next
            // prev end start end.next
            // 还是得画个图，我脑子只有两个寄存器
            if (end == null) break;
            // 在此之后不能用 end.next 了，还是得有 next
            next = end.next;
            reverse(start, next);
            // 两个连接动作
            prev.next = end;
            start.next = next;
            // 三个初始化动作
            prev = start;
            start = next;
            end = start;
        }
        return dum.next;
    }
    void reverse(ListNode start, ListNode stop) {
        ListNode prev = null, cur = start;
        while (cur != stop) {
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }
    }
    
}
